package org.wupuser.controller;

import jakarta.annotation.Resource;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.wupuser.model.User;
import org.wupuser.model.dto.LoginReqDTO;
import org.wupuser.model.dto.LoginRespDTO;
import org.wupuser.model.dto.UpdateUserRequest;
import org.wupuser.service.UserService;
import org.wupuser.util.JedisUtils;

@RequestMapping("/user")
@RestController
public class UserController {
	
	@Resource
	private UserService userService;
	
	
	/**
	 * 检查token是否有效
	 *
	 * @param id 用户id
	 *
	 * @return 返回一个ResponseEntity对象，包含状态码和响应体 状态码200表示token有效，状态码400表示token已过期
	 *
	 */
	@GetMapping("/checktoken")
	public ResponseEntity<?> checkToken(@RequestParam Long id) {
		try {
			String result = JedisUtils.get(String.valueOf(id));
			if (result == null) {
				return ResponseEntity
					.status(400)
					.body("token已过期");
			}
		}
		catch (Exception e) {
			return ResponseEntity
				.status(500)
				.body("Redis连接失败");
		}
		return ResponseEntity
			.status(200)
			.body("token有效");
	}
	
	/**
	 * 根据邮箱地址加载用户信息的接口方法
	 *
	 * @param email 用户邮箱地址，作为查询参数
	 *
	 * @return 返回一个ResponseEntity对象，包含状态码200和用户信息
	 */
	@GetMapping("/load")
	public ResponseEntity<User> loadUser(@RequestParam String email) {
		// 返回状态码200，并将查询到的用户信息作为响应体返回
		return ResponseEntity
			.status(200)
			.body(userService.loadUser(email));
	}
	
	/**
	 * 处理用户登录请求的接口方法
	 *
	 * @param loginReqDTO 包含用户登录信息的请求DTO
	 *
	 * @return ResponseEntity<LoginRespDTO> 返回登录响应结果，包含状态码和响应体
	 */
	@PostMapping("/login")
	public ResponseEntity<LoginRespDTO> userLogin(
		@RequestBody    // 请求体注解，表示将HTTP请求的body内容映射到LoginReqDTO对象
		LoginReqDTO loginReqDTO) {
		
		// 调用userService的login方法处理登录逻辑，传入邮箱和密码
		LoginRespDTO loginRespDTO = userService.login(
			loginReqDTO.getEmail(),
			loginReqDTO.getPassword());
		
		// 检查登录响应消息是否为"登录成功"
		if (loginRespDTO
			.getMessage()
			.equals("登录成功")) {
			
			// 登录成功，返回HTTP状态码200和登录响应结果
			return ResponseEntity
				.status(200)
				.body(loginRespDTO);
		} else {
			// 登录失败，返回HTTP状态码400和登录响应结果
			return ResponseEntity
				.status(400)
				.body(loginRespDTO);
		}
	}
	
	/**
	 * 处理用户注册请求的接口方法
	 *
	 * @param user 包含用户注册信息的请求体，自动映射到User对象
	 *
	 * @return 返回ResponseEntity，包含状态码和响应体 注册成功返回200状态码和"注册成功"消息 注册失败返回400状态码和错误信息
	 */
	@PostMapping("/register")
	public ResponseEntity<?> userRegister(@RequestBody User user) {
		// 调用userService的reg方法处理用户注册逻辑
		String result = userService.reg(user);
		// 判断注册结果
		if (result.equals("注册成功")) {
			// 注册成功，返回200状态码和成功消息
			return ResponseEntity
				.status(200)
				.body(result);
		} else {
			// 注册失败，返回400状态码和错误信息
			return ResponseEntity
				.status(400)
				.body(result);
		}
	}
	
	/**
	 * 更新用户信息的接口方法
	 *
	 * @param updateUserRequest 包含更新用户信息的请求体
	 *
	 * @return 返回响应实体，包含状态码和结果信息
	 */
	@PostMapping("/update/info")
	public ResponseEntity<?> updateUserInfo(
		@RequestBody    // 请求体注解，表示参数从请求体中获取
		UpdateUserRequest updateUserRequest) {    // 更新用户信息的请求对象
		String result = userService.updateUser(updateUserRequest);    // 调用服务层方法更新用户信息
		if (result.equals("修改成功")) {    // 判断更新是否成功
			return ResponseEntity.status(200)    // 成功则返回200状态码
			                     .body(result);    // 返回成功信息
		} else {    // 更新失败的情况
			return ResponseEntity.status(400)    // 返回400状态码表示请求错误
			                     .body(result);    // 返回错误信息
		}
	}
	
	/**
	 * 处理用户头像上传的接口方法
	 *
	 * @param file  用户上传的头像文件
	 * @param email 用户的邮箱地址
	 *
	 * @return 返回响应实体，包含状态码和操作结果信息
	 */
	@PostMapping("/avatar")
	public ResponseEntity<?> userAvatarUpload(
		@RequestParam
		MultipartFile file,
		// 上传的文件对象
		@RequestParam
		String email
		// 用户邮箱
	                                         ) {
		// 调用用户服务层的方法处理头像更新
		String result = userService.userAvatarUpdate(
			file,
			// 上传的文件
			email);// 用户邮箱
		// 判断操作结果
		if (result.equals("修改成功")) {
			// 如果操作成功，返回200状态码和成功信息
			return ResponseEntity
				.status(200)
				.body(result);
		} else {
			// 如果操作失败，返回400状态码和错误信息
			return ResponseEntity
				.status(400)
				.body(result);
		}
	}
	
	/**
	 * 处理用户退出请求的接口方法
	 *
	 * @param email 用户邮箱，作为退出系统的标识
	 *
	 * @return 返回ResponseEntity对象，包含状态码和响应体 - 退出成功时返回状态码200和"退出成功"消息 - 退出失败时返回状态码400和相应的错误消息
	 */
	@GetMapping("/logout")
	public ResponseEntity<?> userLogout(@RequestParam String email) {
		// 调用userService的exit方法处理用户退出逻辑
		String result = userService.exit(email);
		// 判断退出操作的结果
		if (result.equals("退出成功")) {
			// 如果退出成功，返回状态码200和成功消息
			return ResponseEntity
				.status(200)
				.body(result);
		} else {
			// 如果退出失败，返回状态码400和错误消息
			return ResponseEntity
				.status(400)
				.body(result);
		}
	}
}
